#include <stdio.h>
#include <string.h>
#include <time.h>
#include "esp_timer.h"
#include "utils.h"
#include "esp_log.h"

void mac_str_to_bytes(const char *mac_str, uint8_t *mac_bytes)
{
    if (!mac_str || !mac_bytes)
        return;
    sscanf(mac_str, "%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",
           &mac_bytes[0], &mac_bytes[1], &mac_bytes[2],
           &mac_bytes[3], &mac_bytes[4], &mac_bytes[5]);
}
int cjson_get_int(cJSON *root, const char *key)
{
    return cjson_get_int_with_default(root, key, 0);
}

int cjson_get_int_with_default(cJSON *root, const char *key, int default_value)
{
    if (!root || !key) return default_value;
    cJSON *item = cJSON_GetObjectItem(root, key);
    if (cJSON_IsNumber(item))
    {
        return item->valueint;
    }
    return default_value;
}

float cjson_get_float(cJSON *root, const char *key)
{
    return cjson_get_float_with_default(root, key, 0.0);
}

float cjson_get_float_with_default(cJSON *root, const char *key, float default_value)
{
    if (!root || !key) return default_value;
    cJSON *item = cJSON_GetObjectItem(root, key);
    if (cJSON_IsNumber(item))
    {
        return item->valuedouble;
    }
    return default_value;
}

bool cjson_get_bool(cJSON *root, const char *key) {
    return cjson_get_bool_with_default(root, key, false);
}

bool cjson_get_bool_with_default(cJSON *root, const char *key, bool default_value) {
    if (!root || !key) return default_value;

    cJSON *item = cJSON_GetObjectItem(root, key);
    if (!item) return default_value;

    if (cJSON_IsBool(item)) {
        return cJSON_IsTrue(item);
    }

    // 如果 JSON 是数字 0/1，也支持转换为 bool
    if (cJSON_IsNumber(item)) {
        return item->valueint != 0;
    }

    return default_value;
}

const char *cjson_get_str(cJSON *root, const char *key)
{
    return cjson_get_str_with_default(root, key, "");
}
const char *cjson_get_str_with_default(cJSON *root, const char *key, const char *default_value)
{
    if (!root || !key) return default_value;
    cJSON *item = cJSON_GetObjectItem(root, key);
    if (cJSON_IsString(item) && item->valuestring)
    {
        return item->valuestring;
    }
    return default_value;
}

// 返回秒级或毫秒级时间戳字符串
void generate_msgId(char *msgId_str, size_t len)
{
    if (!msgId_str || len == 0)
        return;

    int64_t time_us = esp_timer_get_time(); // 微秒级
    uint64_t time_ms = time_us / 1000;      // 毫秒级

    snprintf(msgId_str, len, "%llu", (unsigned long long)time_ms);
}
